import json
from docx import Document
import os
from docx.shared import Pt
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml import OxmlElement
from docx.oxml.ns import qn

# 递归函数：处理表格中的嵌套表格
def process_table(table):
    # 初始化表格数据
    table_data = []
    
    # 遍历表格的每一行
    for row in table.rows:
        row_data = []
        
        # 遍历每一单元格
        for cell in row.cells:
            # 如果单元格中有嵌套的表格，递归处理
            if len(cell.tables) > 0:
                nested_table_data = []
                for nested_table in cell.tables:
                    nested_table_data.append(process_table(nested_table))
                row_data.append(nested_table_data)  # 将嵌套表格的结果添加到当前行
            else:
                row_data.append(cell.text.strip())  # 普通单元格，直接保存文本
                
        table_data.append(row_data)
    
    return table_data

# 读取 Word 文件并提取表格
# 功能：docx中的转为json；
# 对于包含嵌套表格的单元格，脚本会递归地处理每一个嵌套的表格，并将其作为嵌套数据添加到父表格中的相应位置。嵌套的表格会被转换为一个嵌套的 JSON 对象。
def read_table_from_word(docx_file):
    doc = Document(docx_file)
    tables = doc.tables  # 获取文档中的所有表格
    
    all_tables_data = []
    
    # 处理文档中的每个表格
    for table in tables:
        table_data = process_table(table)
        all_tables_data.append(table_data)
    
    return all_tables_data

def read_table_from_word_call():
    docx_file = "C:/Users/Ayler/Desktop/1.docx"  # 替换为你的 Word 文件路径
    output_file = "output.json"   # 输出 JSON 文件的路径
    table_data = read_table_from_word(docx_file)
    save_table_as_json(table_data, output_file)
    print("转换完成，数据已保存到", output_file)

# 保存为 JSON 文件
def save_table_as_json(table_data, output_file):
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(table_data, f, ensure_ascii=False, indent=4)

def rename_files_in_directory(directory, old_text, new_text):
    """
    遍历指定文件夹，替换文件名中的指定文本
    
    Args:
        directory (str): 目标文件夹路径
        old_text (str): 要替换的文本
        new_text (str): 替换后的文本
    调用：
        target_directory = "E:/天星科技发展有限公司/天星202412的工作汇总/捷通与合一验收-交付文档-2024-12-26/交付文档1226/安装手册"  # 替换为你的目标文件夹路径
        text_to_replace = "部署方案"  # 要替换的文本
        new_text = "安装手册"  # 替换后的文本
        rename_files_in_directory(target_directory, text_to_replace, new_text)
    """
    # 遍历目录
    for filename in os.listdir(directory):
        if old_text in filename:
            old_path = os.path.join(directory, filename)
            new_filename = filename.replace(old_text, new_text)
            new_path = os.path.join(directory, new_filename)
            
            try:
                os.rename(old_path, new_path)
                print(f"已重命名: {filename} -> {new_filename}")
            except Exception as e:
                print(f"重命名 {filename} 时出错: {str(e)}")

def replace_text_in_word(directory, old_text, new_text):
    """
    遍历指定文件夹，替换所有Word文档中的指定文本（内容替换，不改变原有字体格式，文本替代）；
    要求：替换文件夹中所有文件中的内容：包含页眉、正文、表格等，不改变原有字体格式；页眉内容要求替换后还是两端对齐；
    
    Args:
        directory (str): 目标文件夹路径
        old_text (str): 要替换的文本
        new_text (str): 替换后的文本
    """
    for filename in os.listdir(directory):
        if filename.endswith('.docx'):
            file_path = os.path.join(directory, filename)
            try:
                doc = Document(file_path)
                
                # 处理页眉
                for section in doc.sections:
                    header = section.header
                    for paragraph in header.paragraphs:
                        if old_text in paragraph.text:
                            # 保存原始对齐方式
                            original_alignment = paragraph.alignment
                            # 替换文本
                            for run in paragraph.runs:
                                run.text = run.text.replace(old_text, new_text)
                            # 恢复对齐方式
                            paragraph.alignment = original_alignment

                # 处理正文段落
                for paragraph in doc.paragraphs:
                    # 保存原始格式
                    original_alignment = paragraph.alignment
                    for run in paragraph.runs:
                        if old_text in run.text:
                            # 保存原始字体格式
                            original_font = run.font._element
                            run.text = run.text.replace(old_text, new_text)
                            # 恢复字体格式
                            run.font._element = original_font
                    # 恢复对齐方式
                    paragraph.alignment = original_alignment

                # 处理表格
                for table in doc.tables:
                    for row in table.rows:
                        for cell in row.cells:
                            for paragraph in cell.paragraphs:
                                # 保存原始格式
                                original_alignment = paragraph.alignment
                                for run in paragraph.runs:
                                    if old_text in run.text:
                                        # 保存原始字体格式
                                        original_font = run.font._element
                                        run.text = run.text.replace(old_text, new_text)
                                        # 恢复字体格式
                                        run.font._element = original_font
                                # 恢复对齐方式
                                paragraph.alignment = original_alignment

                # 保存修改后的文档
                doc.save(file_path)
                print(f"已处理文件: {filename}")
            except Exception as e:
                print(f"处理文件 {filename} 时出错: {str(e)}")

# 修改主程序
if __name__ == "__main__":
    target_directory = "E:/天星科技发展有限公司/天星202412的工作汇总/捷通与合一验收-交付文档-2024-12-26/交付文档1226/安装手册"  # 替换为你的目标文件夹路径
    text_to_replace = "部署方案"  # 要替换的文本
    new_text = "安装手册"  # 替换后的文本
    replace_text_in_word(target_directory, text_to_replace, new_text)
